home *** CD-ROM | disk | FTP | other *** search
/ QuickTime 2.0 Developer Kit / QuickTime 2.0 Developer Kit.iso / mac / MAC / Programming Stuff / Sample Code / Music Architecture / Mixed Bag / •Instrument Editor / Instrument Editor Draw.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-06  |  11.3 KB  |  615 lines  |  [TEXT/KAHL]

  1. /*
  2.  * file: Instrument Editor Draw.c
  3.  *
  4.  * started 10 June 1992
  5.  * david van brink
  6.  *
  7.  */
  8.  
  9. /*--------------------------
  10.     Inclusions
  11. --------------------------*/
  12. #include "BigEasy2.h"
  13. #include "BigEasyGrafish.h"
  14. #include "IE PrintUtilities.h"
  15. #include "Instrument Editor.h"
  16.  
  17.  
  18.  
  19. /*--------------------------
  20.     Prototytpes
  21. --------------------------*/
  22. #define     kKnobAffectsOthers 16
  23.  
  24. static void DrawSlidersDoc(TDoc *d);
  25. static void GetSliderClip(TDoc *d,Rect *r);
  26.  
  27. static pascal void ScrollAction(ControlHandle cH, short part);
  28. static void DoStatLine(short line,short face,StringPtr s);
  29. static void PinPoint(Rect *r,Point *p);
  30. void GoSliderBack(void);
  31.  
  32. static TDoc *gTheDoc;
  33.  
  34. /*--------------------------
  35.     Cow
  36. --------------------------*/
  37. void DrawDoc(short n)
  38. /*
  39.  * Draws the window.
  40.  */
  41.     {
  42.     TDoc *d;
  43.     Rect r;
  44.  
  45.     d = &gDoc[n - kFirstDocWindow];
  46.  
  47.     GoBW();
  48.  
  49.     r = qd.thePort->portRect;
  50.     r.bottom = kHeaderHeight;
  51.     EraseRect(&r);
  52.     MoveTo(0,kHeaderHeight-3);
  53.     Line(r.right,0);
  54.     MoveTo(0,kHeaderHeight-1);
  55.     Line(r.right,0);
  56.  
  57.     TextFont(3);
  58.     TextSize(9);
  59.     TextFace(bold);
  60.     MoveTo(3,kHeaderHeight - 6);
  61.     DrawChar('“');
  62.     DrawString(d->sd.name);
  63.     DrawChar('”');
  64.     TextFace(0);
  65.     DrawString("\p, ");
  66.  
  67.     PrintPlural(d->sd.instrumentCount + (d->sd.flags & kSynthesizerGMSuperset ? 128 : 0),
  68.             "\pNo","\pROM Instrument","\ps", "\p, ");
  69.     PrintPlural(d->sd.modifiableInstrumentCount, "\pNo","\pUser Instrument","\ps", "\p, ");
  70.     PrintPlural(d->sd.voiceCount, "\pNo","\pVoice","\ps", "\p");
  71.  
  72.     GoBW();
  73.     r = gBigRect;
  74.     r.right = kSliderzoneLeft;
  75.     r.top = kHeaderHeight;
  76.     RGBFore(48000,48000,48000);
  77.     RGBBack(48000,48000,48000);
  78.     PaintRect(&r);
  79.     GoBW();
  80.  
  81.     MoveTo(kSliderzoneLeft-1,kHeaderHeight);
  82.     Line(0,10000);
  83.     r = d->statBounds;
  84.     InsetRect(&r,-1,-1);
  85.     FrameRect(&r);
  86.     MoveTo(r.right,r.top + 2);
  87.     LineTo(r.right,r.bottom);
  88.     LineTo(r.left + 2,r.bottom);
  89.  
  90.     DrawKeyboard(&d->kd);
  91.  
  92.     DrawStats(d);
  93.  
  94.     DrawControls(d->w);
  95.     r = (**d->listH).rView;
  96.     r.right += 15;
  97.     InsetRect(&r,-1,-1);
  98.     FrameRect(&r);
  99.     TextFont(3);
  100.     TextSize(9);
  101.     TextFace(0);
  102.     EraseRect(&(**d->listH).rView);
  103.     if(d->listH)
  104.         LUpdate(qd.thePort->visRgn,d->listH);
  105.     GoBW();
  106.     MoveTo(r.right,r.top+2);
  107.     LineTo(r.right,r.bottom);
  108.     LineTo(r.left+2,r.bottom);
  109.  
  110.     SetupSliderClipDoc(d);
  111.     DrawSlidersDoc(d);
  112.     DoneSliderClipDoc(d);
  113.  
  114.     MoveTo(kSliderzoneLeft-1,kHeaderHeight);
  115.     Line(0,10000);
  116.     }
  117.  
  118. void DoStatLine(short line,short face,StringPtr s)
  119.     {
  120.     MoveTo(kStatLeft + 4,kStatTop + line * kTextAllowance);
  121.     TextFace(face);
  122.     if(s)
  123.         DrawString(s);    
  124.     }
  125.  
  126. void DrawStats(TDoc *d)
  127.     {
  128.     Rect r;
  129.  
  130.     ClipRect(&d->statBounds);
  131.  
  132.     TextFont(3);
  133.     TextSize(9);
  134.     TextFace(0);
  135.     GoBW();
  136.  
  137.     EraseRect(&d->statBounds);
  138.  
  139.     DoStatLine(1,0,"\pInstrument:");
  140.     DoStatLine(2,bold,"\p   ");
  141.     DrawString(d->instrumentName);
  142.  
  143.     DoStatLine(3,0,nil);
  144.     PrintPlural(d->globalKnobCount,
  145.             "\pNo","\pGlobal Knob","\ps", "\p");
  146.  
  147.     DoStatLine(4,0,nil);
  148.     PrintPlural(d->instrumentKnobCount,
  149.             "\pNo","\pInstrument Knob","\ps", "\p");
  150.  
  151.     ClipRect(&gBigRect);
  152.     }
  153.  
  154. void GoSliderBack(void)
  155.     {
  156.     RGBBack(62535,49000,65535);
  157.     }
  158.  
  159. void DrawSlidersDoc(TDoc *d)
  160.     {
  161.     Rect r;
  162.  
  163.     GoSliderBack();
  164.     r = d->visibleSliderBounds;
  165.     OffsetRect(&r,-r.left,-r.top);
  166.     EraseRect(&gBigRect);
  167.     GoBW();
  168.  
  169.     DrawEasyControlList(d->ecl);
  170.     }
  171.  
  172. void ResizeDoc(short n, Point *oldSize, Point *newSize, short modifiers)
  173.     {
  174.     TDoc *d;
  175.  
  176.     d = &gDoc[n - kFirstDocWindow];
  177.  
  178.     GoBW();
  179.     SizeWindow(qd.thePort,newSize->h,newSize->v,true);
  180.     FixForSize(d);
  181.     }
  182.  
  183. void FixForSize(TDoc *d)
  184.     {
  185.     Rect r;
  186.     long x;
  187.     Point wSize;
  188.  
  189.     GoBW();
  190.  
  191.     wSize.h = d->w->portRect.right;
  192.     wSize.v = d->w->portRect.bottom;
  193.  
  194.     r = (**d->listH).rView;
  195.     r.right = kInstrumentListRight - 16;
  196.  
  197.     x = (d->w->portRect.bottom - kDocMargin - r.top) / kInstrumentListCellHeight;
  198.  
  199.     if(x <= 0)
  200.         x = 1;
  201.  
  202.     r.bottom = kInstrumentListCellHeight * x + r.top;
  203.  
  204.     TextFont(3);
  205.     TextSize(9);
  206.     TextFace(0);
  207.     LSize(r.right - r.left,r.bottom - r.top,d->listH);
  208.     LDoDraw(true,d->listH);
  209.  
  210.     r.top = kInstrumentListTop;
  211.     r.right = kSliderzoneLeft;
  212.     r.left = 0;
  213.     r.bottom = 10000;
  214.     InvalRect(&r);
  215.  
  216.     GoBW();
  217.     HideControl(d->horizontalScroller);
  218.     HideControl(d->verticalScroller);
  219.     r = d->w->portRect;
  220.     r.left += kSliderzoneLeft - 1;
  221.     r.right -= 14;
  222.     r.top = r.bottom - 15;
  223.     r.bottom += 1;
  224.     ValidRect(&r);
  225.     MoveControl(d->horizontalScroller,r.left,r.top);
  226.     SizeControl(d->horizontalScroller,r.right - r.left,r.bottom - r.top);
  227.     r = d->w->portRect;
  228.     r.left = r.right - 15;
  229.     r.top += kHeaderHeight - 1;
  230.     r.bottom -= 14;
  231.     r.right += 1;
  232.     ValidRect(&r);
  233.     MoveControl(d->verticalScroller,r.left,r.top);
  234.     SizeControl(d->verticalScroller,r.right - r.left,r.bottom - r.top);
  235.  
  236.  
  237.     GetSliderClip(d,&d->visibleSliderBounds);
  238.     InvalRect(&d->visibleSliderBounds);
  239.  
  240.     x = d->virtualSliderBounds.right
  241.             - d->visibleSliderBounds.right + d->visibleSliderBounds.left;
  242.     if(x < 0)
  243.         {
  244.         x = 0;
  245.         d->lastH = 0;
  246.         }
  247.     SetCtlMax(d->horizontalScroller,x);
  248.     d->lastH = GetCtlValue(d->horizontalScroller);
  249.  
  250.     x = d->virtualSliderBounds.bottom
  251.             - d->visibleSliderBounds.bottom + d->visibleSliderBounds.top;
  252.     if(x < 0)
  253.         {
  254.         x = 0;
  255.         d->lastV = 0;
  256.         }
  257.     SetCtlMax(d->verticalScroller,x);
  258.     d->lastV = GetCtlValue(d->verticalScroller);
  259.  
  260.     ShowControl(d->horizontalScroller);
  261.     ShowControl(d->verticalScroller);
  262.     }
  263.  
  264. void PinPoint(Rect *r,Point *p)
  265.     {
  266.     if(p->h < r->left)
  267.         p->h = r->left;
  268.     if(p->h > r->right)
  269.         p->h = r->right;
  270.     if(p->v < r->top)
  271.         p->v = r->top;
  272.     if(p->v > r->bottom)
  273.         p->v = r->bottom;
  274.     }
  275.  
  276. void ClickDoc(short n,Point p,short mods)
  277. /*
  278.  * Come here for a click in the window.
  279.  */
  280.     {
  281.     ControlClickResult ccr;
  282.     TDoc *d;
  283.     ComponentResult result;
  284.     Point lastP;
  285.     ControlHandle cH;
  286.     short part;
  287.     Rect r;
  288.  
  289.     d = &gDoc[n - kFirstDocWindow];
  290.     gTheDoc = d;
  291.  
  292.     TextFont(3);
  293.     TextSize(9);
  294.     TextFace(0);
  295.  
  296.     GoBW();
  297.  
  298.     r = (**d->listH).rView;
  299.     r.right += 16;
  300.     if(PtInRect(p,&r))
  301.         {
  302.         Boolean doubleClick;
  303.  
  304.         doubleClick = LClick(p,mods,d->listH);
  305.  
  306.         if(doubleClick)
  307.             {
  308.             Cell c;
  309.  
  310.             c = LLastClick(d->listH);
  311.             SetInstrumentForDoc(d,d->instrument[c.v]);
  312.             }
  313.  
  314.         FixUpMenus(d);
  315.  
  316.         goto goHome;
  317.         }
  318.  
  319.     if(p.v < kHeaderHeight)
  320.         {
  321.         MusicPlayNote(d->ci,d->part,p.h,0x64);
  322.         while(StillDown());
  323.         MusicPlayNote(d->ci,d->part,p.h,0);
  324.         goto goHome;
  325.         }
  326.  
  327.     part = FindControl(p,d->w,&cH);
  328.     if(cH)
  329.         {
  330.         if(part == inThumb)
  331.             {
  332.             TrackControl(cH,p,nil);
  333.             NewScrollDoc(d,true,nil);
  334.             }
  335.         else
  336.             TrackControl(cH,p,ScrollAction);
  337.         goto goHome;
  338.         }
  339.  
  340.     if(PtInRect(p,&d->visibleSliderBounds) && !(mods & optionKey))
  341.         {
  342.         Point p2;
  343.  
  344.         TextFont(3);
  345.         TextSize(9);
  346.         SetupSliderClipDoc(d);
  347.  
  348.         p2.h = p.h - d->visibleSliderBounds.left + d->lastH;
  349.         p2.v = p.v - d->visibleSliderBounds.top + d->lastV;
  350.  
  351.         ClickEasyControlList(d->ecl,p2,&ccr,mods);
  352.     
  353.         if(ccr.tracked)
  354.             {
  355.             if(d->whichList == mInstrumentKnobs)
  356.                 {
  357.                 result = MusicSetPartKnob(d->ci,d->part,ccr.id + 1,ccr.value);
  358.                 if ( (*d->ikdList)[ccr.id].flags & kKnobAffectsOthers )
  359.                     UpdateSliderKnobs(d);
  360.  
  361.                 }
  362.             else if(d->whichList == mControllers)
  363.                 result = MusicSetController(d->ci,d->part,ccr.id,ccr.value);
  364.             else
  365.                 {
  366.                 result = MusicSetKnob(d->ci,ccr.id + 1,ccr.value);
  367.                 if ( (*d->gkdList)[ccr.id].flags & kKnobAffectsOthers )
  368.                     UpdateSliderKnobs(d);
  369.                 }
  370.  
  371.             DoneSliderClipDoc(d);
  372.             FlashResult(result);
  373.             }
  374.  
  375.         DoneSliderClipDoc(d);
  376.         if(ccr.tracked)
  377.             goto goHome;
  378.         }
  379.  
  380.     if(PtInRect(p,&d->kd.r))
  381.         {
  382.         short pitch,lastPitch;
  383.  
  384.         lastPitch = -1;
  385.         while(StillDown())
  386.             {
  387.             pitch = GetKeyboardKey(&d->kd,p);
  388.             GetMouse(&p);
  389.             if(pitch != lastPitch)
  390.                 {
  391.                 MusicPlayNote(d->ci,d->part,lastPitch,0);
  392.                 if(pitch >= 0)
  393.                     MusicPlayNote(d->ci,d->part,pitch,0x64);
  394.                 PaintKeyboardKey(&d->kd,lastPitch,0);
  395.                 PaintKeyboardKey(&d->kd,pitch,255);
  396.                 lastPitch = pitch;
  397.                 }
  398.             PaintKeyboardVector(&d->kd,d->keyVel);
  399.             }
  400.         PaintKeyboardKey(&d->kd,lastPitch,0);
  401.         MusicPlayNote(d->ci,d->part,lastPitch,0);
  402.         goto goHome;
  403.         }
  404.  
  405.  
  406.     /* Default: Drag controller area */
  407.     if(PtInRect(p,&d->visibleSliderBounds))
  408.         {
  409.         Point p2,lastP2;
  410.         RgnHandle rH,scrollRgn,updateRgn;
  411.         Rect clipR,movingR,r;
  412.         short x,y;
  413.  
  414.         GoCursor(128);
  415.  
  416.         rH = NewRgn();
  417.         scrollRgn = NewRgn();
  418.         updateRgn = NewRgn();
  419.  
  420.         OpenRgn();
  421.         movingR = clipR = r = d->visibleSliderBounds;
  422.         InsetRect(&r,2,2);
  423.         FrameRect(&r);
  424.         InsetRect(&r,2,2);
  425.         FrameRect(&r);
  426.         CloseRgn(rH);
  427.  
  428.         p2 = lastP2 = p;
  429.  
  430.         ClipRect(&clipR);
  431.         InvertRgn(rH);
  432.         ClipRect(&gBigRect);
  433.  
  434.         x = GetCtlValue(d->horizontalScroller);
  435.         y = GetCtlValue(d->verticalScroller);
  436.  
  437.         r.left = p2.h - (GetControlMaximum(d->horizontalScroller) - x);
  438.         r.right = p2.h + (x - GetControlMinimum(d->horizontalScroller));
  439.  
  440.         r.top = p2.v - (GetControlMaximum(d->verticalScroller) - y);
  441.         r.bottom = p2.v + (y - GetControlMinimum(d->verticalScroller));
  442.  
  443.         GoSliderBack();
  444.  
  445.         do
  446.             {
  447.             GetMouse(&p2);
  448.             PinPoint(&r,&p2);
  449.             if(p2.h != lastP2.h || p2.v != lastP2.v)
  450.                 {
  451.                 short dh,dv;
  452.                 Rect swollenMovingR;
  453.  
  454.                 ClipRect(&clipR);
  455.                 dh = p2.h - lastP2.h;
  456.                 dv = p2.v - lastP2.v;
  457.  
  458.                 swollenMovingR = movingR;
  459.                 if(dh > 0)
  460.                     swollenMovingR.right += dh;
  461.                 else
  462.                     swollenMovingR.left += dh;
  463.                 if(dv > 0)
  464.                     swollenMovingR.bottom += dv;
  465.                 else
  466.                     swollenMovingR.top += dv;
  467.  
  468.                 InvertRgn(rH);
  469.                 OffsetRgn(rH,dh,dv);
  470.                 ScrollRect(&swollenMovingR,dh,dv,scrollRgn);
  471.                 UnionRgn(updateRgn,scrollRgn,updateRgn);
  472.  
  473.                 InvertRgn(rH);
  474.                 ClipRect(&gBigRect);
  475.  
  476.                 OffsetRect(&movingR,dh,dv);
  477.                 SectRect(&movingR,&clipR,&movingR);
  478.  
  479.                 lastP2 = p2;
  480.                 SetCtlValue(d->horizontalScroller,x + p.h - p2.h);
  481.                 SetCtlValue(d->verticalScroller,y + p.v - p2.v);
  482.                 }
  483.             } while(StillDown());
  484.  
  485.         GoBW();
  486.  
  487.         ClipRect(&clipR);
  488.         InvertRgn(rH);
  489.         ClipRect(&gBigRect);
  490.  
  491.         DisposeRgn(rH);
  492.         DisposeRgn(scrollRgn);
  493.  
  494.         GoArrow();
  495.         NewScrollDoc(d,false,updateRgn);
  496.  
  497.         DisposeRgn(updateRgn);
  498.         }
  499.  
  500. goHome:;
  501.     }
  502.  
  503. #define kSmallBump 66
  504. #define kLargeBump (kSliderWidth+kDocMargin)
  505.  
  506. pascal void ScrollAction(ControlHandle cH, short part)
  507.     {
  508.     long oldValue,bump;
  509.  
  510.     oldValue = GetCtlValue(cH);
  511.     switch(part)
  512.         {
  513.         case inUpButton:
  514.             bump = -kSmallBump;
  515.             break;
  516.         case inDownButton:
  517.             bump = kSmallBump;
  518.             break;
  519.         case inPageUp:
  520.             bump = - kLargeBump;
  521.             break;
  522.         case inPageDown:
  523.             bump = kLargeBump;
  524.             break;
  525.         default:
  526.             bump = 0;
  527.         }
  528.  
  529.     SetCtlValue(cH,bump+oldValue);
  530.     NewScrollDoc(gTheDoc,true,nil);
  531.     }
  532.  
  533.  
  534. void NewScrollDoc(TDoc *d,Boolean doScroll,RgnHandle updateRgn)
  535. /*
  536.  * Check for scroller movement, and
  537.  * redraw the scrollable area if necessary.
  538.  */
  539.     {
  540.     long newH, newV;
  541.  
  542.     newH = GetCtlValue(d->horizontalScroller);
  543.     newV = GetCtlValue(d->verticalScroller);
  544.  
  545.     if(newH != d->lastH || newV != d->lastV)
  546.         {
  547.         RgnHandle rH1,rH2;
  548.         Rect r;
  549.  
  550.         rH1 = NewRgn();
  551.         rH2 = NewRgn();
  552.  
  553.         r = d->visibleSliderBounds;
  554.         GoBW();
  555.         RGBBack(62535,49000,65535);
  556.  
  557.         if(doScroll)
  558.             ScrollRect(&r,-newH + d->lastH,-newV + d->lastV,rH1);
  559.         else if(updateRgn)
  560.             CopyRgn(updateRgn,rH1);
  561.             
  562.  
  563.         d->lastH = newH;
  564.         d->lastV = newV;
  565.  
  566.         OffsetRgn(rH1,- d->visibleSliderBounds.left + newH,
  567.                 - d->visibleSliderBounds.top + newV);
  568.  
  569.         SetupSliderClipDoc(d);
  570.         GetClip(rH2);
  571.         SectRgn(rH1,rH2,rH1);
  572.         SetClip(rH1);
  573.  
  574.         DrawSlidersDoc(d);
  575.  
  576.         DoneSliderClipDoc(d);
  577.  
  578.         DisposeRgn(rH1);
  579.         DisposeRgn(rH2);
  580.         }
  581.     }
  582.  
  583.  
  584. void GetSliderClip(TDoc *d,Rect *r)
  585.     {
  586.     *r = d->w->portRect;
  587.     r->top += kHeaderHeight;
  588.     r->left += kSliderzoneLeft;
  589.     r->right -= 15;
  590.     r->bottom -= 15;
  591.     }
  592.  
  593.  
  594. void SetupSliderClipDoc(TDoc *d)
  595.     {
  596.     Rect sliderRect;
  597.     short x,y;
  598.  
  599.     sliderRect = d->visibleSliderBounds;
  600.     GoBW();
  601.     x = d->lastH - sliderRect.left;
  602.     y = d->lastV - sliderRect.top;
  603.     SetOrigin(x,y);
  604.     OffsetRect(&sliderRect,x,y);
  605.     ClipRect(&sliderRect);
  606.     }
  607.  
  608.  
  609. void DoneSliderClipDoc(TDoc *d)
  610.     {
  611.     SetOrigin(0,0);
  612.     ClipRect(&gBigRect);
  613.     }
  614.  
  615.